package cn.com.megan.drawlots.utils;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.Collections;

/**
 * MyBatis-Plus代码生成器
 *
 * @author megan
 * @Date 2025/5/14 17:15
 */
public class CodeGenerator {

    /**
     * 数据库URL
     */
    private static final String DB_URL = "jdbc:mysql://localhost:3306/draw_lots?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8";
    /**
     * 数据库用户名
     */
    private static final String USERNAME = "root";
    /**
     * 数据库密码
     */
    private static final String PASSWORD = "root";
    /**
     * 作者
     */
    private static final String AUTHOR = "megan";
    /**
     * 父包名
     */
    private static final String PARENT_PACKAGE = "cn.com.megan.drawlots";
    /**
     * 项目路径
     */
    private static final String PROJECT_PATH = System.getProperty("user.dir") + "/megan-modules/megan-drawLots";
    /**
     * Mapper XML文件输出路径
     */
    private static final String XML_PATH = PROJECT_PATH + "/src/main/resources/mapper";

    /**
     * 代码生成主方法
     *
     * 表名，多个表名使用英文逗号分隔
     */
    public static void main(String[] args) {
        String tableName = "draw_records,favorites,lucky_wheels,templates,users"; // 替换为要生成的表名
        generateByTable(tableName);
    }

    /**
     * 根据表名生成代码
     *
     * @param tableName 表名
     */
    public static void generateByTable(String tableName) {
        FastAutoGenerator.create(DB_URL, USERNAME, PASSWORD)
                // 全局配置
                .globalConfig(builder -> {
                    builder.author(AUTHOR) // 设置作者
                            .commentDate("yyyy-MM-dd HH:mm:ss") // 注释日期
                            .outputDir(PROJECT_PATH + "/src/main/java") // 输出目录
                            .disableOpenDir() // 禁止打开输出目录
                            .enableSwagger(); // 开启Swagger模式
                })
                // 包配置
                .packageConfig(builder -> {
                    builder.parent(PARENT_PACKAGE) // 设置父包名
                            .entity("entity")
                            .service("service")
                            .serviceImpl("service.impl")
                            .mapper("mapper")
                            .controller("controller")
                            .pathInfo(Collections.singletonMap(OutputFile.xml, XML_PATH)); // 设置mapperXml生成路径
                })
                // 策略配置
                .strategyConfig(builder -> {
                    builder.addInclude(tableName.split(",")) // 设置需要生成的表名
                            // Entity策略配置
                            .entityBuilder()
                            .enableLombok() // 开启lombok
                            .enableChainModel() // 开启链式模型
                            .enableTableFieldAnnotation() // 开启生成实体时生成字段注解
                            .columnNaming(NamingStrategy.underline_to_camel) // 数据库表字段映射到实体的命名策略：下划线转驼峰命
                            .naming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略：下划线转驼峰命
                            .logicDeleteColumnName("del_flag") // 逻辑删除字段
                            // Controller策略配置
                            .controllerBuilder()
                            .enableRestStyle() // 开启生成@RestController控制器
                            // Service策略配置
                            .serviceBuilder()
                            .formatServiceFileName("%sService") // 格式化service接口文件名称
                            .formatServiceImplFileName("%sServiceImpl") // 格式化service实现类文件名称
                            // Mapper策略配置
                            .mapperBuilder()
                            .enableMapperAnnotation() // 开启@Mapper注解
                            .formatMapperFileName("%sMapper") // 格式化mapper文件名称
                            .formatXmlFileName("%sMapper"); // 格式化xml文件名称
                })
                // 使用Freemarker引擎模板
                .templateEngine(new FreemarkerTemplateEngine())
                // 执行
                .execute();

        System.out.println("=============代码生成成功=============");
    }
} 